home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtilities.lha / ATUtilities / disk.asm < prev    next >
Assembly Source File  |  2000-09-26  |  10KB  |  706 lines

  1. code   segment
  2.  
  3.  assume cs:code,ds:code,es:code,ss:code
  4.  
  5.  org 0
  6.  
  7.  
  8. laufwerke  equ 8
  9.  
  10. ger_num   equ 1
  11. befehl    equ 2
  12. status    equ 3
  13. anz_ger   equ 13
  14. wechsel   equ 14
  15. end_adr   equ 14
  16. p_adr     equ 14
  17. anz_bef   equ 16
  18. anzahl    equ 12h
  19. bpb_adr   equ 12h
  20. v_adr     equ 0fh
  21. sektor    equ 26
  22. ger_bez   equ 22
  23.  
  24. buf_seg   equ 22   ; DualPortedRAM->BufferRAM.PCOffset
  25.  
  26. bpb_files    equ 06h
  27. bpb_sektoren equ 08h
  28. bpb_tracks   equ 0dh
  29. bpb_heads    equ 0fh
  30. bpb_secfat   equ 0bh
  31. bpb_secclu   equ 02h
  32. bpb_fats     equ 05h
  33. bpb_medbyte  equ 0ah
  34.  
  35. cmd       equ 16384
  36. arg1      equ cmd+00
  37. arg2      equ cmd+02
  38. arg3      equ cmd+04
  39. arg4      equ cmd+06
  40. arg5      equ cmd+08
  41. arg6      equ cmd+0A
  42. arg7      equ cmd+0C
  43.  
  44. arg6low   equ arg6+1
  45.  
  46. erst_b    equ this byte
  47.  
  48.  dw -1,-1
  49.  dw 0100100000000000b
  50.  dw offset strat
  51.  dw offset intr
  52.  db laufwerke
  53.  db 7 dup (0)
  54.  
  55. fkt_tab:
  56.  dw offset init
  57.  dw offset med_test
  58.  dw offset get_bpb
  59.  dw offset lesen
  60.  dw offset lesen
  61.  dw offset dummy
  62.  dw offset dummy
  63.  dw offset dummy
  64.  dw offset schreiben
  65.  dw offset schreiben
  66.  dw offset dummy
  67.  dw offset dummy
  68.  dw offset schreiben
  69.  dw offset dummy
  70.  dw offset dummy
  71.  dw offset wechselbar
  72.  dw offset schreiben
  73.  
  74. db_ptr     dw (?),(?)
  75.  
  76. bpb_ptr:
  77.       dw offset bpb1
  78.       dw offset bpb2
  79.       dw offset bpb3
  80.       dw offset bpb4  
  81.       dw offset bpb5
  82.       dw offset bpb6
  83.       dw offset bpb7
  84.       dw offset bpb8            
  85. janus_seg  dw (?)    
  86. janus_ofs  dw (?)
  87.  
  88. bpb1:
  89.  dw 512
  90.  db 2
  91.  dw 1
  92.  db 2
  93.  dw 112
  94.  dw 1440
  95.  db 0F9h
  96.  dw 3
  97.  dw 9
  98.  dw 2
  99.  db 1,0,0,0
  100.  
  101. bpb2:
  102.  dw 512
  103.  db 2
  104.  dw 1
  105.  db 2
  106.  dw 112
  107.  dw 1440
  108.  db 0F9h
  109.  dw 3
  110.  dw 9
  111.  dw 2
  112.  db 1,0,0,0
  113.  
  114. bpb3:
  115.  dw 512
  116.  db 2
  117.  dw 1
  118.  db 2
  119.  dw 112
  120.  dw 1440
  121.  db 0F9h
  122.  dw 3
  123.  dw 9
  124.  dw 2
  125.  db 1,0,0,0
  126.  
  127. bpb4:
  128.  dw 512
  129.  db 2
  130.  dw 1
  131.  db 2
  132.  dw 112
  133.  dw 1440
  134.  db 0F9h
  135.  dw 3
  136.  dw 9
  137.  dw 2
  138.  db 1,0,0,0
  139.  
  140. bpb5:
  141.  dw 512
  142.  db 2
  143.  dw 1
  144.  db 2
  145.  dw 112
  146.  dw 1440
  147.  db 0F9h
  148.  dw 3
  149.  dw 9
  150.  dw 2
  151.  db 1,0,0,0
  152.  
  153. bpb6:
  154.  dw 512
  155.  db 2
  156.  dw 1
  157.  db 2
  158.  dw 112
  159.  dw 1440
  160.  db 0F9h
  161.  dw 3
  162.  dw 9
  163.  dw 2
  164.  db 1,0,0,0
  165.  
  166. bpb7:
  167.  dw 512
  168.  db 2
  169.  dw 1
  170.  db 2
  171.  dw 112
  172.  dw 1440
  173.  db 0F9h
  174.  dw 3
  175.  dw 9
  176.  dw 2
  177.  db 1,0,0,0
  178.  
  179. bpb8:
  180.  dw 512
  181.  db 2
  182.  dw 1
  183.  db 2
  184.  dw 112
  185.  dw 1440
  186.  db 0F9h
  187.  dw 3
  188.  dw 9
  189.  dw 2
  190.  db 1,0,0,0
  191.  
  192. vol_name:
  193.  db "DISKTRANS",0,0,0
  194.  
  195.  
  196. strat  proc far
  197.  mov cs:db_ptr,bx
  198.  mov cs:db_ptr+2,es
  199.  ret
  200. strat  endp
  201.  
  202.  
  203. intr   proc far
  204.  pusha
  205.  push es
  206.  push ds
  207.  pushf
  208.  
  209.  push cs
  210.  pop ds
  211.  
  212.  les di,dword ptr db_ptr
  213.  mov bl,es:b[di+befehl]
  214.  cmp bl,anz_bef
  215.  jle bc_okay
  216.  mov ax,8003h
  217.  jmp short intr_end
  218.  
  219. bc_okay:
  220.  shl bl,1
  221.  xor bh,bh
  222.  call [fkt_tab+bx]
  223.  
  224. intr_end  label near
  225.  push cs
  226.  pop ds
  227.  
  228.  les di,dword ptr db_ptr
  229.  or ax,0100h
  230.  mov es:[di+status],ax
  231.  
  232.  popf
  233.  pop ds
  234.  pop es
  235.  popa
  236.  ret
  237. intr  endp
  238.  
  239.  
  240. dummy   proc near
  241.  xor ax,ax
  242.  ret
  243. dummy   endp
  244.  
  245.  
  246. med_test  proc near
  247.  call near select_device
  248.  cmp ax,0
  249.  jne med_test_fehler
  250.  
  251.  push ds
  252.  mov ds,cs:janus_seg
  253.  mov si,cs:janus_ofs
  254.  mov ds:w[si+arg1],4
  255.  call near call_and_wait
  256.  mov ax,ds:w[si+arg2]
  257.  pop ds
  258.  
  259.  mov es:b[di+wechsel],al
  260.  mov ax,offset vol_name
  261.  mov es:w[di+v_adr],ax
  262.  mov es:w[di+v_adr+2],ds 
  263.  xor ax,ax
  264.  
  265. med_test_fehler:
  266.  ret
  267. med_test  endp
  268.  
  269.  
  270. get_bpb  proc near
  271.  call near select_device
  272.  cmp ax,0
  273.  je yyyy
  274.  
  275.  jmp near get_bpb_fehler
  276.  
  277. yyyy:
  278.  push ds
  279.  mov ds,cs:janus_seg
  280.  mov si,cs:janus_ofs
  281.  mov ds:w[si+arg1],4
  282.  call near call_and_wait
  283.  mov ax,ds:w[si+arg2]
  284.  pop ds
  285.  cmp al,0ff
  286.  jne xxxx
  287.  
  288.  jmp near get_bpb_fehler
  289.  
  290. xxxx:
  291.  
  292.  mov si,offset bpb_ptr
  293.  mov bl,es:b[di+ger_num] 
  294.  xor bh,bh
  295.  shl bx,1
  296.  add si,bx
  297.  mov si,cs:w[si]
  298.  mov word ptr es:[di+bpb_adr],si
  299.  mov word ptr es:[di+bpb_adr+2],ds
  300.  
  301.  xor ax,ax
  302. get_bpb_fehler:
  303.  ret
  304. get_bpb  endp
  305.  
  306.  
  307. wechselbar  proc near
  308.  xor ax,ax
  309.  ret
  310. wechselbar  endp
  311.  
  312.  
  313. schreiben  proc near
  314.  push di
  315.  push es
  316.  push ds
  317.  
  318.  call near select_device
  319.  cmp ax,0
  320.  je schreiben_device_okay
  321.  jmp near schreiben_fehler
  322.  
  323. schreiben_device_okay:
  324.  mov bx,es:w[di+anzahl]
  325.  mov dx,es:w[di+sektor]
  326.  lds si,es:[di+p_adr]
  327. schreiben_schleife:
  328.  cmp bx,0
  329.  je schreiben_okay
  330.  
  331.  mov bp,bx
  332.  cmp bp,32
  333.  jle schreiben_2
  334.  mov bp,32
  335.  
  336. schreiben_2:
  337.  push ds
  338.  push si
  339.  push es
  340.  push di
  341.  
  342.  mov es,cs:janus_seg
  343.  mov di,cs:janus_ofs
  344.  mov cx,bp
  345.  shl cx,9
  346.  rep movsb
  347.  
  348.  mov es,cs:janus_seg
  349.  mov di,cs:janus_ofs
  350.  mov es:w[di+arg1],1
  351.  mov es:w[di+arg2],bp
  352.  mov es:w[di+arg3],dx
  353.  call near call_and_wait
  354.  mov cx,es:w[di+arg2]
  355.  
  356.  pop di
  357.  pop es
  358.  pop si
  359.  pop ds
  360.  
  361.  cmp cx,0
  362.  je schreiben_3
  363.  mov ax,cx
  364.  jmp schreiben_fehler 
  365.  
  366. schreiben_3:
  367.  sub bx,bp
  368.  add dx,bp
  369.  mov cx,bp
  370.  shl cx,9
  371.  add si,cx
  372.  jmp schreiben_schleife
  373.  
  374. schreiben_okay:
  375.  call near motor
  376.  cmp cx,0
  377.  jne schreiben_4
  378.  xor ax,ax
  379.  jmp schreiben_fehler
  380.  
  381. schreiben_4:
  382.  mov ax,cx
  383.  
  384. schreiben_fehler:
  385.  pop ds
  386.  pop es
  387.  pop di
  388.  cmp ax,0
  389.  je schreiben_ende
  390.  mov es:w[di+anzahl],0
  391. schreiben_ende:
  392.  ret
  393. schreiben  endp
  394.  
  395.  
  396. lesen  proc near
  397.  push di
  398.  push es
  399.  push ds
  400.  
  401.  call near select_device
  402.  cmp ax,0
  403.  je lesen_device_okay
  404.  jmp near lesen_fehler
  405.  
  406. lesen_device_okay:
  407.  mov bx,es:[di+anzahl]
  408.  mov dx,es:[di+sektor]
  409.  les di,es:[di+p_adr]
  410.  
  411. lese_schleife:
  412.  cmp bx,0
  413.  je lesen_okay
  414.  mov bp,bx
  415.  cmp bp,32
  416.  jle lesen_2
  417.  mov bp,32
  418.  
  419. lesen_2:
  420.  push ds
  421.  push si
  422.  
  423.  mov ds,cs:janus_seg
  424.  mov si,cs:janus_ofs
  425.  mov ds:w[si+arg1],2
  426.  mov ds:w[si+arg2],bp
  427.  mov ds:w[si+arg3],dx
  428.  call near call_and_wait
  429.  mov cx,ds:w[si+arg2]
  430.  
  431.  pop si
  432.  pop ds
  433.  
  434.  cmp cx,0
  435.  je lesen_3
  436.  mov ax,cx
  437.  jmp lesen_fehler 
  438.  
  439. lesen_3:
  440.  push ds
  441.  push di
  442.  mov ds,cs:janus_seg
  443.  mov si,cs:janus_ofs
  444.  mov cx,bp
  445.  shl cx,9
  446.  rep movsb
  447.  pop di
  448.  pop ds
  449.  
  450.  sub bx,bp
  451.  add dx,bp
  452.  mov cx,bp
  453.  shl cx,9
  454.  add di,cx
  455.  jmp lese_schleife
  456. lesen_okay:
  457.  call near motor
  458.  cmp cx,0
  459.  jne lesen_4
  460.  xor ax,ax
  461.  jmp lesen_fehler
  462.  
  463. lesen_4:
  464.  mov ax,cx
  465.  
  466. lesen_fehler:
  467.  pop ds
  468.  pop es
  469.  pop di
  470.  cmp ax,0
  471.  je lesen_ende
  472.  mov es:w[di+anzahl],0
  473. lesen_ende:
  474.  ret
  475. lesen   endp
  476.  
  477.  
  478. motor  proc near
  479.  push es
  480.  push di
  481.  mov es,cs:janus_seg
  482.  mov di,cs:janus_ofs
  483.  mov es:w[di+arg1],3
  484.  call near call_and_wait
  485.  mov cx,es:w[di+arg2]
  486.  pop di
  487.  pop es
  488.  ret
  489. motor  endp
  490.  
  491.  
  492. call_and_wait  proc near
  493.  push ax
  494.  mov ah,7
  495.  mov al,29
  496.  int 0b
  497.  mov ah,8
  498.  mov al,29
  499.  int 0b
  500.  pop ax
  501.  ret
  502. call_and_wait  endp
  503.  
  504.  
  505. select_device  proc near
  506.  push ds
  507.  push es
  508.  push si
  509.  push di 
  510.  mov ds,cs:janus_seg
  511.  mov si,cs:janus_ofs
  512.  mov ds:w[si+arg1],100
  513.  mov bl,es:b[di+ger_num]
  514.  xor bh,bh
  515.  mov ds:w[si+arg2],bx
  516.  call near call_and_wait
  517.  mov ax,ds:w[si+arg2]
  518.  pop di
  519.  pop si
  520.  pop es
  521.  pop ds
  522.  ret
  523. select_device  endp
  524.  
  525.  
  526. treiber_ende  equ this byte
  527. ; ------------------ Ende des Treibers --------------------
  528.  
  529.  
  530. init   proc near
  531.  mov ah,30h
  532.  int 21h
  533.  cmp al,3
  534.  jb prinm
  535.  
  536.  mov cs:w[fkt_tab+00],offset dummy
  537.  
  538.  mov al,es:[di+ger_bez]
  539.  add al,"A"
  540.  mov ger_s,al
  541.  add al,laufwerke-1
  542.  mov ger_e,al 
  543.  
  544. prinm:
  545.  mov dx,offset initm
  546.  mov ah,9
  547.  int 21h
  548.  
  549.  push es
  550.  push di
  551.  
  552.  mov ah,1
  553.  mov al,29
  554.  int 0b
  555.  mov janus_ofs,di
  556.  mov janus_seg,es:w[buf_seg]
  557.  mov ax,di
  558.  
  559.  pop di
  560.  pop es
  561.  
  562.  cmp ax,-1
  563.  jne init_weiter
  564.  
  565.  mov dx,offset init_fehler_text
  566.  mov ah,9
  567.  int 21h
  568.  
  569.  mov word ptr es:[di+end_adr],offset erst_b
  570.  mov es:[di+end_adr+2],ds
  571.  mov byte ptr es:[di+anz_ger],0
  572.  mov ax,20
  573.  jmp init_ende
  574.  
  575. init_weiter:
  576.  mov word ptr es:[di+end_adr],offset treiber_ende
  577.  mov es:[di+end_adr+2],ds
  578.  mov byte ptr es:[di+anz_ger],laufwerke
  579.  mov word ptr es:[di+bpb_adr],offset bpb_ptr
  580.  mov es:w[di+bpb_adr+2],ds
  581.  
  582.  push es
  583.  push di
  584.  
  585.  mov es,cs:janus_seg
  586.  mov di,cs:janus_ofs
  587.  mov es:w[di+arg1],6
  588.  call near call_and_wait
  589.  
  590.  mov cx,0
  591. Kopiere_BPB:
  592.  mov es,cs:janus_seg
  593.  mov di,cs:janus_ofs
  594.  mov es:w[di+arg1],100
  595.  mov es:w[di+arg2],cx
  596.  call near call_and_wait
  597.  mov es:w[di+arg1],5
  598.  call near call_and_wait
  599.  
  600.  mov bx,es:w[di+arg7]
  601.  cmp bx,1
  602.  jne bx2
  603.  jmp bxokay
  604.  
  605. bx2:
  606.  cmp bx,2
  607.  jne bxx
  608.  
  609.  mov si,offset bpb_ptr
  610.  mov bx,cx
  611.  shl bx,1
  612.  add si,bx
  613.  mov si,ds:w[si] 
  614.  mov ds:w[si+bpb_files],224
  615.  mov ds:w[si+bpb_sektoren],2880
  616.  mov ds:w[si+bpb_tracks],80
  617.  mov ds:w[si+bpb_heads],2 
  618.  mov ds:w[si+bpb_secfat],9
  619.  mov ds:b[si+bpb_secclu],1
  620.  mov ds:b[si+bpb_fats],2
  621.  mov ds:b[si+bpb_medbyte],0F0H
  622.  
  623.  jmp bxokay
  624.  
  625. bxx:
  626.  mov si,offset bpb_ptr
  627.  mov bx,cx
  628.  shl bx,1
  629.  add si,bx
  630.  mov si,ds:w[si] 
  631.  mov ds:w[si+bpb_sektoren],es:w[di+arg2]
  632.  mov ds:w[si+bpb_tracks],es:w[di+arg3]
  633.  mov ds:w[si+bpb_heads],es:w[di+arg4] 
  634.  mov ds:w[si+bpb_secfat],es:w[di+arg5]
  635.  mov bl,es:b[di+arg6low]
  636.  mov ds:b[si+bpb_secclu],bl
  637.  mov ds:b[si+bpb_fats],1
  638.  mov ds:b[si+bpb_medbyte],0FBH
  639.  
  640. bxokay: 
  641.  add cx,1
  642.  cmp cx,laufwerke
  643.  je Kopieren_Fertig
  644.  jmp Kopiere_BPB
  645.  
  646. Kopieren_Fertig:
  647.  pop di
  648.  pop es
  649.  
  650.  mov dx,offset init_okay_text
  651.  mov ah,9
  652.  int 21h
  653.  xor ax,ax
  654.  
  655. init_ende:
  656.  ret
  657. init  endp
  658.  
  659.  
  660. exe_start  proc far
  661.  push cs
  662.  pop ds
  663.  
  664.  mov dx,offset exe_text
  665.  mov ah,9
  666.  int 21h
  667.  
  668.  mov ax,4c00
  669.  int 21h
  670. exe_start  endp
  671.  
  672.  
  673. initm:
  674.  db "ATUtilities Disk Transfer  -  Version 3.0  2. August 1994",13,10
  675.  db "Copyright (C) 1993-1994 by Thomas Dreibholz.  All rights reserved.",13,10,"$"
  676.  
  677. init_okay_text:
  678.  db "Treiber wurde erfolgreich für die Laufwerke "
  679. ger_s db "?"
  680.  db ": bis "
  681. ger_e db "?"
  682.  db ": installiert.",13,10,10,"$"
  683.  
  684. init_fehler_text:
  685.  db "Amiga-Handler an Janus-Interrupt 29 ist nicht aktiv!",13,10
  686.  db "Bitte überprüfen Sie die Installation der ATUtilities",13,10
  687.  db "Treiber konnte nicht installiert werden.",13,10,10,"$"
  688.  
  689. exe_text:
  690.  db "ATUtilities Disk Transfer:",13,10
  691.  db "Dieses Programm ist ein Laufwerkstreiber und kann deshalb nicht direkt aufge-",13,10
  692.  db "rufen werden. Um den Treiber zu installieren, muß folgende Zeile in die",13,10
  693.  db "CONFIG.SYS eingefügt werden:",13,10,10
  694.  db "DEVICE=Lw:\Verz\DISK.EXE",13,10,10
  695.  db "Nach dem nächsten Reset stehen dann die neuen Laufwerke zur Verfügung. Bei",13,10
  696.  db "der Installation durch die CONFIG.SYS muß auf dem Amiga das Programm",13,10
  697.  db "Disk Transfer aktiv sein. Zur Vorbereitung und Formatierung und zum Kopieren",13,10
  698.  db "von Disk Transfer-Speichermedien sollte das Programm PREP.EXE benutzt werden.",13,10
  699.  db "Zur Beschleunigung von Zugriffen sollte in der CONFIG.SYS der Eintrag BUFFERS",13,10
  700.  db "auf 15 bis 20 gesetzt werden, oder ein Cache-Programm genutzt werden.",13,10,10,10
  701.  db "17. 09. 1993  -  Version 2.0  Copyright (C) 1993 by Thomas Dreibholz",13,10,10,"$"
  702.  
  703. code  ends
  704.  end exe_start
  705.  
  706.